#include "app_pthread_pool.h"

static mqd_t mq_fd;                // 消息队列文件描述符
static char *mq_name = "/mq_name"; // 消息队列名称
static int pthread_num = 0;        // 线程数
static pthread_t *pthread_id;      // 线程ID

static void *pthread_func(void *arg)
{
    // 不断向线程池接收任务并执行
    Task task;
    while (1)
    {
        int len = mq_receive(mq_fd, (char *)&task, sizeof(Task), NULL);
        if (len == sizeof(Task))
        {
            task.task_func(task.arg);
        }
    }
    return NULL;
}

/**
 * @brief 初始化线程池
 *
 * @param num_threads 线程池中的线程数
 * @return int 0 成功，-1 失败
 */
int pthread_pool_init(int num)
{
    // 创建消息队列
    struct mq_attr attr;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = sizeof(Task);
    mq_fd = mq_open(mq_name, O_RDWR | O_CREAT, 0644, &attr);
    if (mq_fd == -1)
    {
        log_error("任务消息队列创建失败");
        return -1;
    }
    // 创建线程池
    pthread_num = num;
    pthread_id = (pthread_t *)malloc(pthread_num * sizeof(pthread_t));
    for (int i = 0; i < pthread_num; i++)
    {
        pthread_create(pthread_id + i, NULL, pthread_func, NULL);
    }
    return 0;
}
/**
 * @brief 销毁线程池
 *
 */
void pthread_pool_destroy()
{
    // 关闭并删除消息队列
    mq_close(mq_fd);
    mq_unlink(mq_name);
    // 销毁线程池
    for (int i = 0; i < pthread_num; i++)
    {
        pthread_cancel(pthread_id[i]);
        pthread_join(pthread_id[i], NULL);
    }
    free(pthread_id);
}
/**
 * @brief 注册任务
 *
 * @param task_func 任务函数
 * @param arg 任务参数
 */
int pthread_pool_registerTask(int (*task_func)(void *), void *arg)
{
    // 接收任务并向任务消息队列发送
    Task task;
    task.task_func = task_func;
    task.arg = arg;
    return mq_send(mq_fd, (char *)&task, sizeof(Task), 0);
}
